집합 연산
개요
조인은 컬럼에 대해서, 수직으로 합치는 연산이었다면 이쪽은 행에 대해서 행하는 연산이다.
참고로 집합 연산에서 order by를 사용할 때는 별칭을 사용할 수 없다.
여기는 사용법이 그렇게 대단한 건 없어서 실습 사진은 넣지 않겠다.
UNION
합집합.
중복된 행은 하나로만 표현해준다.
이때 중복을 없애는 과정에서 dbms내부에서 정렬이 발생된다.
그러나 완전하게 정렬이 보장되길 바란다면 결국 order by를 사용해야 한다.
UNION ALL
중복을 다 포함하는 합집합이다.
참고로 기본적으로 정렬이 되지 않는다.
INTERSECT
교집합
SELECT A.SUBWAY_STATN_NO
, A.LN_NM
, A.STATN_NM
FROM TB_SUBWAY_STATN A
WHERE A.STATN_NM ='신도림'
INTERSECT
SELECT B.SUBWAY_STATN_NO
, B.LN_NM
, B.STATN_NM
FROM TB_SUBWAY_STATN B
WHERE B.LN_NM ='2호선'
ORDER BY SUBWAY_STATN_NO
교집합만 보여준다.
SELECT A.SUBWAY_STATN_NO
, A.LN_NM
, A.STATN_NM
FROM TB_SUBWAY_STATN A
WHERE STATN_NM ='신도림'
AND EXISTS (SELECT 1
FROM TB_SUBWAY_STATN K
WHERE K.SUBWAY_STATN_NO = A.SUBWAY_STATN_NO
AND K.LN_NM = '2호선'
)
ORDER BY SUBWAY_STATN_NO
;
이런 식으로 서브쿼리를 통해서도 같은 결과를 일으킬 수 있다.
EXCEPT(MINUS)
차집합
오라클에서는 또 괜히 특이하게 minus라고 쓴다.
여기에서 주의할 것이 하나 있는데, minus 연산을 하면 마지막에 중복 결과를 전부 날리고 출력이 나오게 된다.
즉, union all을 한 뒤에 이걸 쓴다면 중복이 다 날아가 버린다는 것이다.